home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / OSEmu / mathffp.s < prev    next >
Text File  |  2000-04-12  |  5KB  |  292 lines

  1. * $Id: mathffp.s 1.1 1999/02/03 04:09:05 jotd Exp $
  2.  
  3. **************************************************************************
  4. *   MATHFFP-LIBRARY                                                      *
  5. **************************************************************************
  6. **************************************************************************
  7. *   INITIALIZATION                                                       *
  8. **************************************************************************
  9.  
  10. MATHFFPINIT    move.l    _mffpbase,d0
  11.         beq    .init
  12.         rts
  13.  
  14. .init        move.l    #-_LVOSPDiv,d0
  15.         move.l    #LIB_SIZE,D1
  16.         lea    _mffpname,a0
  17.         jsr    _InitLibrary
  18.         move.l    d0,a0
  19.         move.l    d0,_mffpbase
  20.  
  21.         patch    _LVOSPFlt(a0),SPFlt(pc)
  22.         patch    _LVOSPFix(a0),SPFix(pc)
  23.         patch    _LVOSPDiv(a0),SPDiv(pc)
  24.         patch    _LVOSPMul(a0),SPMul(pc)
  25.         
  26.         rts
  27.  
  28. ; < D0: signed int
  29. ; > D0: double precision float
  30.  
  31.     dc.b    "SPFlt",0    
  32. SPFlt:
  33.     MOVEQ    #95,D1
  34.     TST.L    D0
  35.     BEQ.S    .lab_0003
  36.     BPL.S    .lab_0000
  37.     MOVEQ    #-32,D1
  38.     NEG.L    D0
  39.     BVS.S    .lab_0002
  40.     SUBQ.B    #1,D1
  41. .lab_0000:
  42.     CMP.L    #$00007FFF,D0
  43.     BHI.S    .lab_0001
  44.     SWAP    D0
  45.     SUB.B    #$10,D1
  46. .lab_0001:
  47.     ADD.L    D0,D0
  48.     DBMI    D1,.lab_0001
  49.     TST.B    D0
  50.     BPL.S    .lab_0002
  51.     ADD.L    #$00000100,D0
  52.     BCC.S    .lab_0002
  53.     ROXR.L    #1,D0
  54.     ADDQ.B    #1,D1
  55. .lab_0002:
  56.     MOVE.B    D1,D0
  57. .lab_0003:
  58.     RTS
  59.  
  60. SPFlt_jotd:
  61.     tst.l    D0
  62.     beq.b    .exit
  63.     
  64.     movem.l    D1-D2,-(A7)
  65.  
  66.     move.w    #$40,D2
  67.  
  68.     btst    #31,D0
  69.     beq    .positive
  70.     move.w    #$C0,D2
  71.     neg.l    D0
  72. .positive:
  73.     move.l    D0,D1
  74. .sh1loop:
  75.     tst.l    D1
  76.     beq.b    .sh1out
  77.     addq.l    #1,D2
  78.     lsr.l    #1,D1
  79.     bra.b    .sh1loop
  80. .sh1out:
  81.  
  82. .sh2loop:
  83.     btst    #31,D0
  84.     bne.b    .sh2out
  85.     add.l    D0,D0
  86.     bra.b    .sh2loop
  87. .sh2out:
  88.     or.w    D2,D0
  89.  
  90.     movem.l    (A7)+,D1-D2
  91.  
  92. .exit
  93.     rts
  94.     
  95. ; SPDiv:
  96. ; < D0 : numerator
  97. ; < D1 : divisor
  98. ; > D0 : result
  99. ;
  100. ; Ripped and adapted by JOTD from ROM code (shame :) )
  101.  
  102.     dc.b    "SPDiv",0
  103. SPDiv:
  104.     MOVEM.L    D3-D5,-(A7)        ;18: 48E71C00
  105.     MOVE.B    D1,D5            ;1C: 1A01
  106.     beq    .divbyzero
  107.     MOVE.L    D0,D4            ;20: 2800
  108.     BEQ    .rslt0            ;22: 67DC
  109.     MOVEQ    #-128,D3        ;24: 7680
  110.     ADD    D5,D5            ;26: DA45
  111.     ADD    D4,D4            ;28: D844
  112.     EOR.B    D3,D5            ;2A: B705
  113.     EOR.B    D3,D4            ;2C: B704
  114.     SUB.B    D5,D4            ;2E: 9805
  115.     BVS.S    .overflow
  116.     CLR.B    D0            ;32: 4200
  117.     SWAP    D0            ;34: 4840
  118.     SWAP    D1            ;36: 4841
  119.     CMP    D1,D0            ;38: B041
  120.     BMI.S    .LAB_0005        ;3A: 6B06
  121.     ADDQ.B    #2,D4            ;3C: 5404
  122.     BVS.S    .overflow
  123.     ROR.L    #1,D0            ;40: E298
  124. .LAB_0005:
  125.     SWAP    D0            ;42: 4840
  126.     MOVE.B    D3,D5            ;44: 1A03
  127.     EOR    D5,D4            ;46: BB44
  128.     LSR    #1,D4            ;48: E24C
  129.     MOVE.L    D0,D3            ;4A: 2600
  130.     DIVU    D1,D3            ;4C: 86C1
  131.     MOVE    D3,D5            ;4E: 3A03
  132.     MULU    D1,D3            ;50: C6C1
  133.     SUB.L    D3,D0            ;52: 9083
  134.     SWAP    D0            ;54: 4840
  135.     SWAP    D1            ;56: 4841
  136.     MOVE    D1,D3            ;58: 3601
  137.     CLR.B    D3            ;5A: 4203
  138.     MULU    D5,D3            ;5C: C6C5
  139.     SUB.L    D3,D0            ;5E: 9083
  140.     BCC.S    .LAB_0007        ;60: 6406
  141. .LAB_0006:
  142.     SUBQ    #1,D5            ;62: 5345
  143.     ADD.L    D1,D0            ;64: D081
  144.     BCC.S    .LAB_0006        ;66: 64FA
  145. .LAB_0007:
  146.     MOVE.L    D1,D3            ;68: 2601
  147.     SWAP    D3            ;6A: 4843
  148.     CLR    D0            ;6C: 4240
  149.     DIVU    D3,D0            ;6E: 80C3
  150.     SWAP    D5            ;70: 4845
  151.     BMI.S    .LAB_0008        ;72: 6B08
  152.     MOVE    D0,D5            ;74: 3A00
  153.     ADD.L    D5,D5            ;76: DA85
  154.     SUBQ.B    #1,D4            ;78: 5304
  155.     MOVE    D5,D0            ;7A: 3005
  156. .LAB_0008:
  157.     MOVE    D0,D5            ;7C: 3A00
  158.     ADD.L    #$00000080,D5        ;7E: DABC00000080
  159.     MOVE.L    D5,D0            ;84: 2005
  160.     MOVE.B    D4,D0            ;86: 1004
  161.     BEQ.S    .rslt0
  162. .exit:
  163.     MOVEM.L    (A7)+,D3-D5        ;8A: 4CDF0038
  164.     RTS                ;8E: 4E75
  165.  
  166. .rslt0:
  167.     MOVEQ    #0,D0            ;10: 7000
  168.     bra.b    .exit
  169.  
  170. .overflow:
  171. .divbyzero:
  172.     move.l    #$7FFFFF,D0
  173.     bra    SPFlt        ; big value
  174.  
  175.     dc.b    "SPMul",0
  176. SPMul:
  177.     MOVEM.L    D3-D5,-(A7)
  178.     MOVE.B    D0,D5
  179.     BEQ.S    lmul_0000
  180.     MOVE.B    D1,D4
  181.     BEQ.S    lmul_0003
  182.     ADD    D5,D5
  183.     ADD    D4,D4
  184.     MOVEQ    #-128,D3
  185.     EOR.B    D3,D4
  186.     EOR.B    D3,D5
  187.     ADD.B    D4,D5
  188.     BVS.S    lmul_0004
  189.     MOVE.B    D3,D4
  190.     EOR    D4,D5
  191.     ROR    #1,D5
  192.     SWAP    D5
  193.     MOVE    D1,D5
  194.     CLR.B    D0
  195.     CLR.B    D5
  196.     MOVE    D5,D4
  197.     MULU    D0,D4
  198.     SWAP    D4
  199.     MOVE.L    D0,D3
  200.     SWAP    D3
  201.     MULU    D5,D3
  202.     ADD.L    D3,D4
  203.     SWAP    D1
  204.     MOVE.L    D1,D3
  205.     MULU    D0,D3
  206.     ADD.L    D3,D4
  207.     CLR    D4
  208.     ADDX.B    D4,D4
  209.     SWAP    D4
  210.     SWAP    D0
  211.     MULU    D1,D0
  212.     SWAP    D1
  213.     SWAP    D5
  214.     ADD.L    D4,D0
  215.     BPL.S    lmul_0001
  216.     ADD.L    #$00000080,D0
  217.     MOVE.B    D5,D0
  218.     BEQ.S    lmul_0003
  219. lmul_0000:
  220.     MOVEM.L    (A7)+,D3-D5
  221.     RTS
  222. lmul_0001:
  223.     SUBQ.B    #1,D5
  224.     BVS.S    lmul_0003
  225.     BCS.S    lmul_0003
  226.     MOVEQ    #64,D4
  227.     ADD.L    D4,D0
  228.     ADD.L    D0,D0
  229.     BCC.S    lmul_0002
  230.     ROXR.L    #1,D0
  231.     ADDQ.B    #1,D5
  232. lmul_0002:
  233.     MOVE.B    D5,D0
  234.     BEQ.S    lmul_0003
  235.     MOVEM.L    (A7)+,D3-D5
  236.     RTS
  237. lmul_0003:
  238.     MOVEQ    #0,D0
  239.     MOVEM.L    (A7)+,D3-D5
  240.     RTS
  241. lmul_0004:
  242.     BPL.S    lmul_0003
  243.     EOR.B    D1,D0
  244.     OR.L    #$FFFFFF7F,D0
  245.     TST.B    D0
  246.     ORI.B    #$02,CCR
  247.     MOVEM.L    (A7)+,D3-D5
  248.     RTS
  249.  
  250.     dc.b    "SPFix",0
  251. SPFix:
  252.     MOVE.B    D0,D1
  253.     BMI.S    lfix_0003
  254.     BEQ.S    lfix_0000
  255.     CLR.B    D0
  256.     SUB.B    #$41,D1
  257.     BMI.S    lfix_0002
  258.     SUB.B    #$1F,D1
  259.     BPL.S    lfix_0001
  260.     NEG.B    D1
  261.     LSR.L    D1,D0
  262. lfix_0000:
  263.     RTS
  264. lfix_0001:
  265.     MOVEQ    #-1,D0
  266.     LSR.L    #1,D0
  267.     ORI.B    #$02,CCR
  268.     RTS
  269. lfix_0002:
  270.     MOVEQ    #0,D0
  271.     RTS
  272. lfix_0003:
  273.     CLR.B    D0
  274.     SUB.B    #$C1,D1
  275.     BMI.S    lfix_0002
  276.     SUB.B    #$1F,D1
  277.     BPL.S    lfix_0004
  278.     NEG.B    D1
  279.     LSR.L    D1,D0
  280.     NEG.L    D0
  281.     RTS
  282. lfix_0004:
  283.     BNE.S    lfix_0005
  284.     NEG.L    D0
  285.     TST.L    D0
  286.     BMI.S    lfix_0000
  287. lfix_0005:
  288.     MOVEQ    #0,D0
  289.     BSET    #31,D0
  290.     ORI.B    #$02,CCR
  291.     RTS
  292.